package com.dianping.puma.pumaserver.router.decoder.binlog;
import com.dianping.puma.core.dto.binlog.request.BinlogSubscriptionRequest;
import com.dianping.puma.core.util.ConvertHelper;
import com.dianping.puma.pumaserver.exception.DecoderException;
import com.dianping.puma.pumaserver.router.decoder.RequestDecoder;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.QueryStringDecoder;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class BinlogSubscriptionDecoder implements RequestDecoder {
private static final String DEFAULT_CODEC = "json";
private static final boolean DEFAULT_DDL = false;
private static final boolean DEFAULT_DML = true;
private static final boolean DEFAULT_TRANSACTION = false;
Pattern pattern = Pattern.compile("^/puma/binlog/subscribe.*$");
@Override
public boolean match(FullHttpRequest request) {
return pattern.matcher(request.getUri()).matches();
}
@Override
public Object decode(FullHttpRequest request) throws DecoderException {
if (request.getMethod().equals(HttpMethod.POST)) {
String json = request.content().toString(Charset.forName("utf-8"));
return ConvertHelper.fromJson(json, BinlogSubscriptionRequest.class);
}
BinlogSubscriptionRequest binlogSubscriptionRequest = new BinlogSubscriptionRequest();
Map<String, List<String>> params = (new QueryStringDecoder(request.getUri())).parameters();
binlogSubscriptionRequest.setClientName(params.get("clientName").get(0));
binlogSubscriptionRequest.setDatabase(params.get("database").get(0));
if (!params.containsKey("table")) {
throw new DecoderException("must contain `table` in `BinlogSubscriptionRequest`");
} else {
binlogSubscriptionRequest.setTables(params.get("table"));
}
if (!params.containsKey("codec")) {
binlogSubscriptionRequest.setCodec(DEFAULT_CODEC);
} else {
binlogSubscriptionRequest.setCodec(params.get("codec").get(0));
}
if (!params.containsKey("ddl")) {
binlogSubscriptionRequest.setDdl(DEFAULT_DDL);
} else {
binlogSubscriptionRequest.setDdl(Boolean.valueOf(params.get("ddl").get(0)));
}
if (!params.containsKey("dml")) {
binlogSubscriptionRequest.setDml(DEFAULT_DML);
} else {
binlogSubscriptionRequest.setDml(Boolean.valueOf(params.get("dml").get(0)));
}
if (!params.containsKey("transaction")) {
binlogSubscriptionRequest.setTransaction(DEFAULT_TRANSACTION);
} else {
binlogSubscriptionRequest.setTransaction(Boolean.valueOf(params.get("transaction").get(0)));
}
return binlogSubscriptionRequest;
}
}